import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.List;

import antlr.RecognitionException;
import antlr.TokenStreamException;

import procesador.Consulta;
import procesador.Tabla;
import procesador.consultas.ProcConsultas;
import procesador.tablas.ProcTablas;


public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		String fileEj = "ejemplos/EjercicioWindrdbi.txt";
		String fileTa = "ejemplos/Tablas.rdb";
		System.out.println("******************************************************************");
		System.out.println("*                         TRABAJO PL1                            *");
		System.out.println("******************************************************************");
		System.out.println("Comenzando... " + GregorianCalendar.getInstance().getTime() + "\n");
		System.out.println("Procesando tablas...");
		ProcTablas procT;
		try {
			procT = new ProcTablas(fileTa);
			if(procT.verifica().size() == 0){
				System.out.println("Tablas sin errores.");
				procT.muestraArbol().show();
				
				List<Tabla> tablas = procT.traduce();
				System.out.println("Tablas procesadas");
				muestraTablas(tablas);
				
				System.out.println("Procesando consultas...");
				ProcConsultas procC = new ProcConsultas(fileEj, tablas);
				if(procC.verifica().size() == 0){
					System.out.println("Consultas sin errores.");
					procC.muestraArbol().show();
					List<Consulta> consultas = procC.traduce();
					System.out.println("Consultas procesadas.");
					muestraConsultas(consultas);
				}
			}
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (RecognitionException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (TokenStreamException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
		}
	}
	
	private static String leePorTeclado(String texto){
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
		
		if(texto != null && texto.length() > 0)
			System.out.println(texto);
		
		try {
			return br.readLine();
		} catch (IOException e) {
			return "";
		}
	}
	
	private static void muestraTablas(List<Tabla> tablas){
		Iterator<Tabla> it = tablas.iterator();
		System.out.println("Tablas:");
		while(it.hasNext()){
			Tabla tabla = it.next();
			System.out.println("\t" + tabla);
			System.out.println("\t\tSQL: " + tabla.generarSQL());
			System.out.println("\tRegistros:");
			Iterator<String> regs = tabla.generarSQLRegistros().iterator();
			while(regs.hasNext())
				System.out.println("\t\t" + regs.next());
		}
	}
	
	private static void muestraConsultas(List<Consulta> consultas){
		System.out.println("Consultas: ");
		Iterator<Consulta> it = consultas.iterator();
		while(it.hasNext()){
			Consulta consulta = it.next();
			System.out.println("\t" + consulta.getNombre());
			System.out.println("\t\t" + consulta.getSQL());
		}
	}
}
